import { _decorator, Component, director, find, Label, Node, resources, Sprite, TextAsset, UIOpacity } from 'cc';
// 可以这样引用一下
import { HTTP } from './HTTP';
import { Global } from '../global';
const { ccclass, property } = _decorator;

@ccclass('comVersionNumber')
export class comVersionNumber extends Component {
    // http请求
    private http: HTTP = null;
    // 网络连接状态
    @property(Label)
    private loadingLabel: Label = null;
    onLoad() {
        this.initManager(); // 初始化全局对象
        this.getVersionNumber(); // 获取客户端版本号
    }

    // 初始化全局对象
    initManager() {
        this.http = Global.http;
    }

    // 获取客户端版本号
    getVersionNumber() {
        resources.load('/version/versionNumber', (err, data: TextAsset) => {
            if (err) {
                console.error('Failed to load version.json:', err);
                return;
            }
            this.getServerVersionNumber(data); // 获取服务器版本号 异步执行的放在这里确保获取本地之后再获取服务器版本号
        });
    }

    // 获取服务器版本号
    getServerVersionNumber = (data: TextAsset) => {
        let xhr: XMLHttpRequest = null;
        let connect = false; // 网络连接状态
        this.loadingLabel.string = '正在连接服务器...';
        xhr = this.http.sendRequest("/version", 'GET', null, (res) => {
            xhr = null;
            connect = true;
            this.onSuccess(res, data);
        })
        
        // 网络连接失败
        if (!connect) {
            setTimeout(() => {
                this.startGame(connect, xhr);
            }, 3000); // 3秒后重新连接
        }
    }

    // 成功连接
    onSuccess(res, data: TextAsset) {
        if (res.verNum !== data.text) {
            this.loadingLabel.string = '版本号不一致，请更新！';
        } else {
            this.loadingLabel.string = '连接成功！';
            this.onFadeOut(() => {
                // 切换到login场景
                director.loadScene('login');
            })
        }
    }

    // 请求启动
    startGame = (status: boolean, result: XMLHttpRequest) => {
        if (!status) {
            if (result) {
                result.abort(); // 取消请求
            }
            this.loadingLabel.string = '连接失败，重新连接中';
            setTimeout(this.getServerVersionNumber, 4000);
        }
    }


    // 场景淡出
    onFadeOut(callback: Function) {
        let nowTime = Date.now(); // 开始时间
        setTimeout(() => {
            this.changeFade(callback, nowTime);
        }, 30);
    }

    // 淡出设置透明度
    changeFade = (callback: Function, nowTime: number) => {
        const openBg = find('Canvas/openBg'); // 获取节点
        // 检测是否存在
        if (openBg.getComponent(Sprite).spriteFrame == null) {
            callback(); // 不存在则直接回调,作用是切换到login场景
            return;
        }
        const fadeTime = 3000; // 淡出时间
        let timePercent = 0;
        let duration = 0;
        // 每过一段时间减少透明度
        duration = Date.now() - nowTime;
        // 已经过去的时间占总时间的百分比
        timePercent = duration / fadeTime;
        if (timePercent > 1) {
            timePercent = 1;
        }

        // 需要在openBg上挂载UIOpacity组件，才能使用opacity属性
        openBg.getComponent(UIOpacity).opacity = 255 * (1 - timePercent); // 透明度
        if (timePercent == 1) {
            openBg.active = false;
            callback();
            return;
        } else {
            setTimeout(() => {
                this.changeFade(callback, nowTime);
            }, 30);
        }
    }
}

